pull: Display download progress of individual objects as we get it
authorColin Walters <walters@verbum.org>
Fri, 11 Apr 2014 05:31:14 +0000 (01:31 -0400)
committerColin Walters <walters@verbum.org>
Fri, 11 Apr 2014 05:31:14 +0000 (01:31 -0400)
It was kind of annoying at least for rpm-ostree upgrades since /boot
happens to be first and we eat a 21MB initramfs with no download
progress.

https://bugzilla.gnome.org/show_bug.cgi?id=726348

src/libostree/ostree-fetcher.c
src/libostree/ostree-repo-pull.c

index c3e5803aea8fe7cf495cc43faeee17349ba45808..c8db3a0855a30adbd58b344531df4f97c13583fa 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "config.h"
 
+#include <gio/gfiledescriptorbased.h>
+
 #include "ostree-fetcher.h"
 #include "ostree.h"
 #include "otutil.h"
@@ -240,8 +242,15 @@ on_splice_complete (GObject        *object,
   goffset filesize;
   GError *local_error = NULL;
 
+  /* Close it here since we do an async fstat(), where we don't want
+   * to hit a bad fd.
+   */
   if (pending->out_stream)
-    g_hash_table_remove (pending->self->output_stream_set, pending->out_stream);
+    {
+      if (!g_output_stream_close (pending->out_stream, pending->cancellable, &local_error))
+        goto out;
+      g_hash_table_remove (pending->self->output_stream_set, pending->out_stream);
+    }
 
   pending->state = OSTREE_FETCHER_STATE_COMPLETE;
   file_info = g_file_query_info (pending->out_tmpfile, OSTREE_GIO_FAST_QUERYINFO,
@@ -283,7 +292,7 @@ on_request_sent (GObject        *object,
   OstreeFetcherPendingURI *pending = user_data;
   GError *local_error = NULL;
   gs_unref_object SoupMessage *msg = NULL;
-  GOutputStreamSpliceFlags flags = G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET;
+  GOutputStreamSpliceFlags flags = G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE;
 
   pending->state = OSTREE_FETCHER_STATE_COMPLETE;
   pending->request_body = soup_request_send_finish ((SoupRequest*) object,
@@ -571,14 +580,12 @@ ostree_fetcher_bytes_transferred (OstreeFetcher       *self)
   while (g_hash_table_iter_next (&hiter, &key, &value))
     {
       GFileOutputStream *stream = key;
-      GFileInfo *finfo;
-
-      finfo = g_file_output_stream_query_info (stream, "standard::size",
-                                               NULL, NULL);
-      if (finfo)
+      struct stat stbuf;
+      
+      if (G_IS_FILE_DESCRIPTOR_BASED (stream))
         {
-          ret += g_file_info_get_size (finfo);
-          g_object_unref (finfo);
+          if (gs_stream_fstat ((GFileDescriptorBased*)stream, &stbuf, NULL, NULL))
+            ret += stbuf.st_size;
         }
     }
   
index fa50b9bde8f455894565ff012b51f728579f98b4..363c2fef454fef5cc5ec9d822fc535c565e31d74 100644 (file)
@@ -229,6 +229,7 @@ run_mainloop_monitor_fetcher (OtPullData   *pull_data)
   if (pull_data->progress)
     {
       update_timeout = g_timeout_source_new_seconds (1);
+      g_source_set_priority (update_timeout, G_PRIORITY_HIGH);
       g_source_set_callback (update_timeout, update_progress, pull_data, NULL);
       g_source_attach (update_timeout, g_main_loop_get_context (pull_data->loop));
       g_source_unref (update_timeout);